#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

static void DisplayPending(const sigset_t pending)
{
    cout << "当前进程的 pending 表为：";
    int i = 1;
    while(i < 32)
    {
        if(sigismember(&pending, i))
            cout << "1";
        else 
            cout << "0";
        i++;
    }
    cout << endl;
}

static void handler(int signo)
{
    cout << signo << " 号信号已抵达" << endl;
    int n = 10;
    while(n--)
    {
        sigset_t pending;
        sigemptyset(&pending);
        int ret = sigpending(&pending);
        assert(ret == 0);
        (void)ret;

        DisplayPending(pending);
        sleep(1);
    }
}

//int main()
//{
//    sigset_t set, oset;
//
//    sigemptyset(&set);
//    sigemptyset(&oset);
//
//    sigaddset(&set, 2);
//    sigprocmask(SIG_BLOCK, &set, &oset);
//
//    int n = 0;
//
//    while(true)
//    {
//        if(n == 5)
//        {
//            sigprocmask(SIG_SETMASK, &oset, 0);
//        }
//
//        sigset_t pending;
//        sigemptyset(&pending);
//
//        int ret = sigpending(&pending);
//        assert(ret == 0);
//        (void)ret;
//
//        DisplayPending(pending);
//        //cout << "味儿太冲了" << endl;
//        n++;
//        sleep(1);
//    }
//    return 0;
//}
//
int main()
{
    cout << "当前进程" << getpid() << endl;
    struct sigaction act, oldact;

    memset(&act, 0, sizeof(act));
    memset(&oldact, 0, sizeof(oldact));

    act.sa_handler = handler;

    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    sigaddset(&act.sa_mask, 5);

    sigaction(2, &act, &oldact);

    while(true)
        return 0;
}
